home *** CD-ROM | disk | FTP | other *** search
- Xref: ruuinf comp.lang.basic.visual:31368 comp.answers:8674 news.answers:32848
- Newsgroups: comp.lang.basic.visual,comp.answers,news.answers
- Path: ruuinf!sun4nl!EU.net!howland.reston.ans.net!gatech!newsfeed.pitt.edu!hudson.lm.com!netline-fddi.jpl.nasa.gov!nntp.et.byu.edu!news.provo.novell.com!park.uvsc.edu!knosack
- From: knosack@park.uvsc.edu (Kris Nosack)
- Subject: FAQ: comp.lang.basic.visual VB/Win Frequently Asked Questions
- X-Content-Currency: This FAQ changes regularly. When a saved or printed copy
- is over 6 months old, please obtain a new one.
- Expires: Fri, 23 Dec 1994 05:30:50 GMT
- Reply-To: Jan.Haugland@uib.no (Jan Steinar Haugland)
- Organization: Visual Basic FAQ Maintainers
- Date: Tue, 6 Dec 1994 06:31:05 GMT
- Approved: news-answers-request@MIT.Edu
- X-Posting-Frequency: Posted on the 5th and 20th of each month.
- Message-ID: <visual-basic-faq-windows-1-786695450@uib.no>
- Followup-To: comp.lang.basic.visual
- Summary: Frequently asked questions concerning Visual Basic for Windows.
- Keywords: FAQ VISUAL BASIC WINDOWS
- Sender: knosack@park.uvsc.edu (Kris Nosack)
- Supersedes: <visual-basic-faq-windows-1-785399435@uib.no>
- Lines: 2488
-
- Posted-By: auto-faq 3.1.1.2
- Archive-name: visual-basic-faq/windows
-
- Last-modified: 17.11.94
-
-
- VISUAL BASIC FOR WINDOWS (VB/Win)
- Frequently asked Questions & Answers
- Section IX - B
-
-
- The following symbols indicates new & updated topics:
-
- [++] means topic is updated in this issue
- [**] means topic is new in this issue
-
- Hope this makes it easier for Our Regular Readers ;-)
-
-
-
- TABLE OF CONTENTS:
- ******************
-
-
- A. PREFACE
-
-
- B. GENERAL VISUAL BASIC QUESTIONS
-
- 1. Does VB/Win make standalone .EXE files?
-
- 2. What is the current version of Visual Basic for Windows?
-
- 3. Where can I get updated VB and other Microsoft files?
-
- 4. Help! I am lost on ftp.microsoft.com.
-
- 5. Where can I get good up-to-date information about VB?
- [++]
-
- 6. Are there any examples of commercial applications built
- using Visual Basic?
-
-
- C. COMMON VISUAL BASIC PROGRAMMING QUESTIONS
-
- 1. What's the difference between MODAL and MODELESS forms?
-
- 2. When/Why should I use Option Explicit?
-
- 3. Why does everybody say I should save in TEXT not BINARY?
-
- 4. Is the Variant type slower than using other variable
- types?
-
- 5. How do I make a text box not beep but do something else
- when I hit the Enter key?
-
- 6. How do I implement an incremental search in
- list/dir/combo/file boxes? [++]
-
- 7. How do I get the Tab key to be treated like a normal
- character?
-
- 8. How do I make an animated icon for my program?
-
- 9. What is passing by reference?
-
- 10. I get a "file not found" error on the IIF function when
- I distribute by program. Uh?
-
- 11. Is there any way to pass a variable to a form apart from
- using global variables?
-
- 12. How should dates be implemented so they work with other
- language and country formats?
-
- 13. Can a VB application be an OLE server?
-
- 14. How do I dial a phone number without using the MSCOMM
- VBX?
-
- 15. I have [several] megabytes of memory. Why do I get an
- "out of memory" error?
-
- 16. How do I mimic a toggle button?
-
- 17. How do I get my application on top?
-
- 18. Is there a way to break long lines in VB code?
-
- 19. How do I remove/change the picture property of a control
- at design time?
-
- 20. Is a [foo] VBX/DLL available as shareware/freeware?
-
- 21. How do I make my applications screen-resolution
- independent?
-
- 22. How do I do Peek and Poke? [++]
-
- 23. Why doesn't "my string" & Chr$(13) do what I want?
-
- 24. How do I prevent multiple instances of my program?
-
- 25. How do I implement an accelerator key for a text box?
-
- 26. How do I force a file dialogue box to reread the currect
- disk? [**]
-
-
- D. ADVANCED VISUAL BASIC PROGRAMMING ISSUES
-
- 1. How do I tell when an application executed using the
- SHELL command is finished?
-
- 2. How do I access C style strings?
-
- 3. How can I change the printer Windows uses in code without
- using the print common dialog?
-
- 4. Any tips for speeding up VB?
-
- 5. How do I speed up control property access?
-
- 6. How much gain in performance will I get if I write my
- number crunching routines in C instead of Visual Basic?
-
- 7. How do you make a TEXTBOX read only? Or, how do I prevent
- the user from changing the text in a TEXTBOX?
-
- 8. How can I create a VBX?
-
- 9. How do you change the system menu (on the Control-Menu
- Box)?
-
- 10. How do I play MID, WAV or other multimedia files?
-
- 11. How can I call a 'hidden' DOS program from VB?
-
- 12. How do I do drag & drop between applications? [++]
-
- 13. How do I use GetPrivateProfileString to read from INI
- files? [++]
-
- 14. How do I implement Undo?
-
- 15. How do I create a window with a small title bar as in a
- floating toolbar?
-
- 16. What is Pseudocode?
-
- 17. Does VB support pointers to functions?
-
- 18. How do I program the Novell NetWare API from VB? [++]
-
- 19. Some Visual Basic 4 rumours
-
-
- E. CALLING THE WINDOWS API AND DLLs IN GENERAL
-
- 1. What is the Windows API?
-
- 2. How do I call a DLL?
-
- 3. What about DLL calls that require callbacks?
-
- 4. Tips for calling DLLs (such as the Windows API)
-
-
- F. VISUAL BASIC AND DATABASES
-
- 1. Why can't I use an index with my VB accessed database?
-
- 2. Why does my compiled VB database app generate an error
- when it ran just fine in the design environment?
-
- 3. Is the Access Engine and Visual Basic Pro good enough for
- database work?
-
- 4. How do you avoid the "Invalid use of null" error when
- reading null values from a database?
-
- 5. What is "NULL"?
-
- 6. How can I access a record by record number?
-
- 7. How about Access 2.0 compatibility?
-
- 8. Tips for VB database programming:
-
- 9. How come I get a "No Current Record" error when I use a a
- Data Control on an empty table?
-
- 10. How can I speed up my VB database application?
-
- 11. How do I get a bitmap picture in a field in an Access
- database?
-
- 12. What is "Reserved Error -1209"? [**]
-
- 13. "Cannot perform operation. illegal.." with Paradox 3.5
- table(s) [**]
-
-
- G. DISTRIBUTING VISUAL BASIC APPLICATIONS
-
- 1. What are some tips for using Setup Wizard?
-
- 2. Are there restrictions on what I can distribute with my
- VB program?
-
- 3. What alternatives to setup wizard do I have?
-
- 4. Do I need to worry about users who have Progman
- replacements such as Norton Desktop and PC Tools?
-
- 5. Can I distribute my app without vbrunXXX.dll?
-
- 6. Why won't my setup program install commdlg.dll et. al.?
-
- 7. Where do I install VBXs and DLLs?
-
-
- H. MISCELLANEOUS TIPS AND INFORMATION
-
- 1. Multiple identifiers after the DIM statement can be
- confusing
-
- 2. "Clean up" your project before final EXE compilation.
-
- 3. Multiple END statements can be dangerous; or, The program
- that refused to terminate.
-
- 4. What are the latest versions of the various files used by
- VB?
-
-
- I. VISUAL BASIC FOR APPLICATIONS (VBA)
-
- 1. Any tips for VB/Win 3 programmers moving to VBA?
-
- 2. Does VBA support VBXs?
-
- 3. How do I access properties on my dialog boxes in VBA?
-
- 4. How do I use database routines from Excel VBA?
-
-
-
- A. PREFACE
-
-
- This document is a compilation of frequently asked questions and
- their answers about Visual Basic for Windows and Visual Basic for
- Applications which have been gathered from posts to the
- comp.lang.basic.visual newsgroup. Although efforts have been made
- to find obvious errors, there is no guarantee that the information
- in this document is error-free. Neither the FAQ maintainer nor
- anyone else associated with this document assume ANY liability for
- the content or use of this document. If you find any errors, please
- report them to the address given below.
-
- This FAQ document is protected by international copyright
- regulations. Permission is granted to distribute it freely, both in
- electronic and written format, provided no charge is made. Also, do
- not make changes to this document without the consent of the
- maintainer. Usenet netiquette applies.
-
- Most FAQs (including this one) are available at the anonymous ftp
- archive site "rtfm.mit.edu". All parts of the VB FAQ may be found
- in the directory "pub/usenet/comp.lang.basic.visual".
-
- You can also have the VB FAQs e-mailed to you by sending a message
- to "mail-server@rtfm.mit.edu" with ONLY the text
-
- send usenet/news.answers/visual-basic-faq/*
-
- in the BODY of the message.
-
- In this document, whenever a long line of code must be split into
- two or more lines of text in the code examples, a | symbol will
- precede each line which should be appended to the line above it.
-
- As the FAQ maintainer, I don't have time to explore all of the
- aspects of Visual Basic. I rely on your submissions to improve the
- quality and inclusiveness of this document. If you have found a VB
- hint, tip, trick, work-around, etc., please write it up and send it
- to me!
-
- Jan Steinar Haugland (Jan.Haugland@uib.no), VB/Win FAQ maintainer
-
- Please note that my first language is not English. You can safely
- ignore all typos, but if you find an error that is so embarrassing
- you can't help pulling your hair and screaming loud, just send me a
- note and I'll correct it quietly. OK?
-
- I would like to thank all contributers, and also all those who have
- given constructive feedback. This FAQ is now widely distributed in
- the net community.
-
- Special thanks to the following people who have made many and
- invaluable contributions to the VB/Win FAQ: Kris Nosack (the
- previous maintainer), Peter Millard, Nic Gibson, Mr. "D" (the
- anonymous contributor), George Tatge (gat@csn.org), Andy Dingley
- (dingbat@codesmth.demon.co.uk), and those I may have forgotten
- (sorry).
-
- Your help is GREATLY appreciated!
-
-
- B. GENERAL VISUAL BASIC QUESTIONS
-
-
- 1. Does VB/Win make standalone .EXE files?
-
- VB/Win produces .exe files, but they are not standalone. All VB/Win
- programs must be distributed with the VBRUNx00.DLL file (where x is
- the major version number). This DLL must accompany all VB/Win
- programs, but only one such file should reside on every system
- where VB programs are used.
-
- 2. What is the current version of Visual Basic for Windows?
-
- VB/Win is currently at version 3.0
-
- 3. Where can I get updated VB and other Microsoft files?
-
- Microsoft Software Library (MSL) is accessible from the following
- services:
-
- - Compu$erve
-
- GO MSL
- Search for <filename.EXE>
-
- - Microsoft Download Service (MSDL)
- Dial (206) 936-6735 to connect to MSDL
-
- - Internet (anonymous FTP)
- ftp ftp.microsoft.com
- Change to the \softlib\mslfiles directory
- (There are a LOT of files in this directory! It is not
- advisable to list all the files unless you have good time.
- See map below.)
-
- 4. Help! I am lost on ftp.microsoft.com.
-
- You no longer have to be! The site have been reorganised, and
- you'll find the file DIRMAP.TXT in root (or whatever it's called on
- a 3.5 NT server). Here's the file as I found it (stolen ruthlessly
- from the server for yoru convenience):
-
- *------------------------------------------------------------------
- -----*
- This file is to help you find your way around ftp.microsoft.com.
- This
- file only covers the directory structure two levels deep. If you
- see a
- 'kb' directory in a second level directory, it contains all of the
- information regarding that second level directory. For example,
- the
- /developr/win32dk directory has a kb directory in it. This kb
- directory
- contains all of the articles for any 32 bit development kit.
-
- ROOT DIRECTORY SUB DIRECTORY CONTENTS
- ---------------------------------------------------------------
-
- ADVSYS Advanced Systems, Networks,
- Mail
- LANMAN LanMan & other networks
- MAIL Mail and Schedule+
- MSCLIENT Microsoft Networking Client
- SQL_ODBC SQL and ODBC
- WINNT Windows NT
- WINSOCK Windows Sockets information
-
- DESKAPPS Desktop Applications
- ACCESS Access
- DOSWORD Word for MS-DOS
- EXCEL Excel
- GAMES Entertainment Packs, Flight
- Sim, etc.
- HOMEAPPS Home applications
- (Fine Artist, Creative Writer)
- MISCAPPS Other applications
- MMAPPS Multimedia Titles
- OFFICE Microsoft Office
- POWERPT PowerPoint
- PROJECT Project
- PUBLISHER Publisher
- WORD Word for Windows & Macintosh
- WRKS_MNY Works and Money
-
- DEVELOPR Developer Tools and Information
- BASIC Quick Basic & other Basics
- DEVCAST DevCast information
- DEVUTIL MS Test, Delta, EXEMOD, EXEPACK,
- & LIB Utility
- DRG Developer Relations Group
- FORTRAN Fortran and Fortran
- PowerStation
- FOX FoxPro and FoxBase
- MAPI Messaging API information
- MASM Macro Assembler
- MSDN Microsoft Developer Network
- MSJ Microsoft Systems Journal
- OLE OLE
- TAPI Telephony API information
- VB Visual Basic
- VISUAL_C Visual C++, MFC, & other C
- products
-
- WIN_DK Windows SDK, DKs & At Work
- WIN32DK 32 bit Development Kits
-
- MSEDCERT Microsoft Education and Certification
- EDUCATIO Microsoft Education information
- CERTIFIC Microsoft Certified Professional info
-
- MSFT Microsoft shareholder information
- ANNREPT Microsoft Annual Report
- BACKGRND Background information on Microsoft
- PRESSREL Microsoft Press Releases
- SEC Recent filings with the Securities and
- Exchange Commission
-
- SOFTLIB Instructions & index for software library
- MSLFILES Software library files (> 1500 files)
-
- PEROPSYS Personal Operating Systems and Hardware
- HARDWARE Mouse & other Hardware
- MSDOS MS-DOS
- WINDOWS Windows (all versions)
- WIN_NEWS Information on Windows "Chicago"
-
- TECHNET Information on TechNet
- SERVDIR Microsoft Services Directory
-
- *-----------------------------------------------------------------*
-
- NOTE: Directory and file names at ftp.microsoft.com are NOT case
- sensitive.
-
- Thanks to Richard Mason (richard@whitney.demon.co.uk) for the map
- he made for us before this long overdue reorganisation, and thanks
- for bringing this to my attention.
-
- 5. Where can I get good up-to-date information about VB? [++]
-
- If you do any VB programming at all, you really should get the
- latest copy of the Microsoft Knowledge Base from one of the sources
- listed above! The filename is VBKB.EXE or VBKB_FT.EXE for the
- version with full text searching. The Knowledge Base is a Windows
- help formatted document that is updated almost monthly. (Beware:
- The files are huge!)
-
- The EXE files on ftp.microsoft.com (and other places) are simple
- self-extracting files. They don't do any automatic updating of your
- system, just dump the file(s) inside them in the current directory
- on your disk, uncompressed and ready for use. Just replace the old
- files on your system with the new files (same name, usually).
-
- This FAQ (ahem) is a pretty good source as a digest of many of the
- VB issues that are discussed in the comp.lang.basic.visual
- newsgroup, but as such the information contained in this FAQ may
- not have been thoroughly tested or verified.
-
- For easier access to and use of this FAQ document, get the Windows
- Help file format FAQ doc by anonymous ftp to quasar.sba.dal.ca and
-
- look under /www/hlp. The .HLP version is made by Tim Roberts
- (TJR@SBACOOP.SBA.DAL.CA). This is HIGHLY RECOMMENDED.
-
- Dave McCarter puts out a nice Windows help formatted document
- called "Visual Basic Tips and Tricks". A good resource with
- information that isn't found in the Knowledge Base. It can be found
- by anonymous ftp to ftp.cica.indiana.edu
- /pub/pc/win3/programr/vbasic/ as VBTIPS??.ZIP, where '??' is the
- version number (yes, get the one with the highest number).
-
- Mark Schoonover has started a monthly magazine called _VBWin
- Programmer's Magazine_ that is compiled around the Discussion of
- Microsoft Visual Basic and Related Issues mailing list. This
- magazine is available at the usual ftp sites like cica and at his
- BBS (619) 571-2846. Mark can be contacted at schoon@cts.com. It
- also has its own anonymous ftp site: ftp.cts.com in the
- /pub/schoon/VBWM.Issues directory.
-
- There is presently an effort to put together a VB code library so
- that VB users can share their best - and trickiest - programming
- work. The code library project is being spear headed by Hein Ragas
- who has managed to get a directory on CICA for code snippets to be
- deposited. Stayed tuned to comp.lang.basic.visual for more
- information.
-
- There's a VISBAS-L mailing list for Visual Basic. You can subscribe
- to this mailing list by sending an email to
-
- LISTSERV@tamvm1.tamu.edu
-
- Place the following text in the *body* of the message (no, not the
- subject line):
-
- SUB VISBAS-L Real Name
-
- Where Real Name is just that, *your full real name* not your email
- address. Note that the traffic on this list may overflow your
- mailbox if you have a limited mail buffer. Expect around 40-50
- messages every weekday, a bit less during weekends. Also, to
- unsubscribe, do as above but with "UNSUB" in the body of the
- message to the LISTSERV address, *not* to the VISBAS-L list address
- itself (Believe it or not, we usually receive 2-3 sub/unsub mails
- every day on the list, and we're really fed up!) Also, this mail
- server was split and a new list called VBDATA-L was made for Vb
- database (Jet) related topics. Same procedure for registering (SUB
- VBDATA-L Real Name).
-
- The address for the MS ACCESS listserver is listserv@indycms.bitnet
- or listserv@indycms.iupui.edu The list name is ACCESS-L. To
- subscribe, you follow the same procedure as for the other lists.
-
- Sorry, I know no mailservers or other Internet resources dedicated
- to VBA specifically. Send me any information you may have, and I'll
- bring it on.
-
- There are several Usenet newsgroups dedicated to MS Windows
- programming and use. There's recently been a major group creation
- process. Those groups that may be of special interest to VB
- programmers are marked with *:
-
- comp.os.ms-windows.misc
- comp.os.ms-windows.programmer.misc
- comp.binaries.ms-windows
- comp.os.ms-windows.advocacy
- comp.os.ms-windows.announce
- comp.os.ms-windows.apps
- comp.os.ms-windows.nt.misc
- comp.os.ms-windows.nt.setup
- comp.os.ms-windows.programmer.tools *
-
- comp.os.ms-windows.programmer.win32
- comp.os.ms-windows.setup *
- comp.os.ms-windows.programmer.winhelp *
- comp.os.ms-windows.programmer.networks
- comp.os.ms-windows.programmer.graphics
- comp.os.ms-windows.programmer.controls *
-
- The latest groups have been added to split the enormous traffic on
- the *.misc groups down in managable chunks. However, the second
- group (.programmer.misc) contains lots of interesting info (mostly
- C related), if you have the time to read it all!
-
- Also note comp.lang.pascal which is a very good newsgroup for
- Pascal, including Borland Pascal and Turbo Pascal for Windows.
-
- Please don't use this guide to find out where you should crosspost
- VB questions. Check the charter for each group before posting to
- it. If you are sure that your crosspost is legitimate, please note
- the crossposting in the text.
-
- NOTE: PLEASE don't post VB stuff to comp.lang.visual. This group
- has *nothing* to do with Visual Basic, and the academics discussing
- "real" visual programming there are very, very annoyed at what they
- call "quasi-visual" stuff and postings about those languages to
- their group.
-
- If you have a Compu$erve account, you will find a forum for Visual
- Basic there, including some support from Microsoft:
-
- MS BASIC Forum (GO MSBASIC)
-
- Message Sections Available: Libraries Available:
- 1 Forum News/Info 1 MS Info and Index
- 2 Setup Wizard/Kit 2 Setup Wizard/Kit
- 3 Data Access Objects 3 Data Access Objects
- 4 The Data Control 4 The Data Control
- 5 Programming Issues 5 Programming Issues
- 6 ODBC Connectivity 6 ODBC Connectivity
- 7 SQL Queries 7 SQL Queries
- 8 ProEdition Controls 8 ProEdition Controls
- 9 Calling API's/DLL's 9 Calling API's/DLL's
- 10 Using OLE/DDE 10 VBWIN-ODBC/Database
- 11 MSCOMM control 11 MSCOMM control
- 12 MCI/MAPI controls 12 MCI/MAPI controls
- 13 DOS Visual Basic 13 DOS Visual Basic
- 14 DOS and Mac Basic 14 DOS and Mac Basic
- 15 Suggestions/Mktg. 15 Suggestions/Mktg.
- 16 CDK 16 CDK
- 17 3rd Party Products 17 3rd Party Products
-
- There are magazines dedicated to VB. The best known is Fawcett
- Technical Publications' _Visual Basic Programmer's Journal_ (VSPJ).
- Phone 800-848-5523 (for US credit card orders) or 303-541-0610
- (int'l and US other orders), Email 74003.224@compuserve.com to
- Shirley Modric for subscription info. Address is 280 Second Street,
- Suite 200, Los Altos, CA 94022-3603 USA.
-
- From Randy Coates (rcoates@telerama.lm.com):
- I currently subscribe to "Inside Visual BASIC for Windows" from the
- Cobb Group. Although it is a helpful monthly paper (about 14 pages
- per publication), I find it to be overpriced when compared to VB
- Programmers Journal. Here is the information anyway: Domestic
- $59/yr ($7.00 each); Outside US $79/yr ($8.50 each)
- Phone: Toll Free: 800-223-8720), Local: 502-491-1900, Customer
- Relations Fax: 502-491-8050, Editorial Department Fax: 502-491-
- 4200. Address: _Inside Visual BASIC for Windows_, 9420 Bunsen
- Parkway, Suite 300, Louisville, KY 40220.
-
- (Note: for completeness other VB magazines should be listed, and I
- would like to receive info on those!)
-
- 6. Are there any examples of commercial applications built using
- Visual Basic?
-
- Profit by Microsoft was written mostly in Visual Basic. In fact,
- Profit was one of three programs selected as PC Magazine's Editor's
- Choice among Windows small business accounting packages.
-
- Microsoft uses VB extensively for smaller utilities. 3 of the small
- apps in the Windows and Windows for Workgroups Resource Toolkits
- are written in VB. Also, if you have the Microsoft Bookshelf CD-
- ROM, you will notice that the MVOPTION.EXE program, which is an
- "options" program for MS Viewer, is created in VB.
-
- Note: The existence of VBX files in a package doesn't ecessarily
- mean that it was written in VB. The most popular C++ compilers also
- support VBXes.
-
-
- C. COMMON VISUAL BASIC PROGRAMMING QUESTIONS
-
-
- 1. What's the difference between MODAL and MODELESS forms?
-
- MODAL forms are forms which require user input before any other
- actions can be taken place. In other words, a modal form has
- exclusive focus until it is dismissed. When showing a modal form,
- the program pauses at the SHOW command until the modal form is
- either hidden or unloaded. The internal MsgBox and InputBox forms
- are examples of modal forms. To show a form modally, use the
- syntax:
-
- MyForm.SHOW 1
-
- MODELESS forms are those which are shown but do not require
- immediate user input. MDI child forms are always modeless. To show
- a form modeless, use the syntax:
-
- MyForm.SHOW
-
- 2. When/Why should I use Option Explicit?
-
- Option Explicit forces you to declare all variables before using
- them. Opinions vary greatly on this subject. The main reason to use
- the OPTION EXPLICIT statement at the top of all modules is to
- minimize the amount of bugs introduced into your code by
- misspelling a variable name. Most variants of BASIC (including VB)
- have the capability to create variables 'on the fly' (without any
- declarations). This capability can be a double edged sword.
-
- At the minimum, some suggest using the DEFINT A-Z statement in leu
- of OPTION EXPLICIT. This statement will cause any variables which
- are created on the fly to be created as integers as opposed to
- variant (VB 3.0) or single precision (VB 1.0 and 2.0). (Integers
- take up less memory).
-
- The OPTION EXPLICIT statement causes VB to 'disable' its ability to
- create variables on the fly. Thus, all variables must be declared
- using a DIM or REDIM statement. All variables not declared will
- cause an error when the OPTION EXPLICIT statement is used. This
- will eliminate bugs caused by a misspelled variable. The option
- works module-wide, so you can have some modules with and some
- without this option in your project.
-
- 3. Why does everybody say I should save in TEXT not BINARY?
-
- Actually, saving in binary mode is a bit faster, so why do we
- recommend you to save in text?
-
- If you save the source and the project as text, it becomes ASCII
- (or really, ANSI) code that you can edit with any text editor or
- (if you are careful when you save) word processor. If you save in
- binary, only the VB development environment, current or later
- versions, will understand the code. The Setup Wizard can not scan
- binary projects. Also, source documenters and other programming
- tools usually require text mode. If you use text, you can use a
- simple text editor (ie. notepad) to cut and paste code from other
- source/form modules into your current project. Some 'tricks' (like
- making an array of 1 control into a single non-array control again)
- is easily done with an editor but not that easy in the environment.
- If you want to print your project to paper the file|print option in
- the VB environment is often not good enough; you may want to import
- the text files into your word processor. And, finally, if something
- goes wrong (only one byte is changed!) you may be out of luck in
- binary mode. In text mode you will more easily be able to fix it.
-
- 4. Is the Variant type slower than using other variable types?
-
- Generally, yes, if we are talking numeric variable types. The
- Variant type also increases memory overhead. To test the speed
- difference, try the following piece of code in something like a
- button_click event and keep the debug window on the screen:
-
- Dim Va As Variant
- Dim In As Integer
- T1! = Timer
- For i% = 1 To 32766
- Va = i%
- Next i%
- T2! = Timer
- Debug.Print "With variant: "; Format$((T2! - T1!), "0.0000")
- T1! = Timer
- For i% = 1 To 32766
- In = i%
- Next i%
- T2! = Timer
- Debug.Print "With integer: "; Format$((T2! - T1!),"0.0000")
-
- This test shows (on our test system) that integers are ~60% faster!
- However, for strings there where no real difference, or in some
- instances, variants were faster than strings for routines with
- heavy conversion usage. For the best result in your application,
- test your routines directly.
-
- 5. How do I make a text box not beep but do something else when I hit
- the Enter key?
-
- Put "something else" in your _KeyPress event, depending on what you
- really want. This code example makes *nothing* happen, for an
- extended period of time:
-
- Sub Text1_KeyPress (KeyAscii As Integer)
- If KeyAscii = 13 Then '13 is Key_Return
- KeyAscii = 0
- End If
- End Sub
-
- This might not be a very nice thing to do, since your users usually
- have some intention when they press Enter. Often they will want to
- jump to the next control, like the Tab key does. To have the Enter
- key emulate the Tab key action, you will need to add the line
- 'SendKeys "{tab}"' above 'KeyAscii=0' in the example above (Yes, I
-
- thought KeyAscii=9 works but it doesn't! Tab is obviously handled
- by Windows on a lower level).
-
- By the way, you'll also find this in the Microsoft VB Knowledge
- Base (see KB Q78305 and Q85562).
-
- Note: If MultiLine=True you will *not* want to disable the normal
- behaviour of the Enter key.
-
- 6. How do I implement an incremental search in list/dir/combo/file
- boxes? [++]
-
- This is your lucky day. Dan Champagne (Dan_Champagne@dell.com) made
- some VB code (no DLLs are necessary!) which easily provides this
- feature for your applications:
-
- ' Code by Dan Champagne
- ' 4/18/94
-
- ' This code can be used to do an incremental search in either a
- ' list box, dir, combo, or a file box. The following code is set
- ' for a file box called FILE1. To make it work with a list box, or
- ' a file box with a different name, change all occurences of FILE1
- ' with whatever you or VB has named your list, combo, dir, or file box.
- ' There are two places where you will need to change these. They are
- ' on the last couple of lines in the KeyPress code.
- ' Also, thanks to John Tarr for helping debug the code.
-
- 'In a .BAS file, add the following:
- 'searchme$ is a global vaiable that will keep track of what the
- 'user has typed so far.
- Global searchme$
-
- 'The following needs to be on one line.
- Declare Function SendMessageBystring& Lib "User" ALIAS
- |"SendMessage" (ByVal hWnd%, ByVal wMsg%, ByVal
- |wParam%, ByVal lParam$)
-
- Global Const WM_USER = &H400
- Global Const LB_SELECTSTRING = (WM_USER + 13)
- Global Const LB_FINDSTRING = (WM_USER + 16)
-
- 'In File1 under keydown, add the following:
- 'This checks if the user has pressed the up or down arrow.
- 'If they have, reset searchme$ to "".
- If KeyCode = 40 Or KeyCode = 38 Then
- searchme$ = ""
- End If
-
- 'In File1 under lostfocus, pathchange, patternchange, and click add:
-
- 'If the user has done any of the above, reset the searchme$
- 'string.
- searchme$ = ""
-
- 'In File1 under keypress add:
-
- Dim result&
-
- Select Case KeyAscii
- Case 8 'Backspace
- If searchme$ <> "" Then
- searchme$ = Left$(searchme$, Len(searchme$) - 1)
- Else
- File1.ListIndex = 0
- End If
- KeyAscii = 0
- Exit Sub
- Case 27 'Escape
-
- searchme$ = ""
- KeyAscii = 0
- Exit Sub
- Case 13 'Enter
- searchme$ = ""
- KeyAscii = 0
- Exit Sub
- Case Asc("a") To Asc("z"), Asc("A") To Asc("Z"), Asc("'"),
- |Asc("."), Asc(" "), Asc("0") To Asc("9")
- searchme$ = searchme$ & Chr$(KeyAscii)
- KeyAscii = 0
- End Select
-
- result& = SendMessageBystring(FILE1.hWnd, LB_FINDSTRING,
- |0, searchme$)
-
- If result& = -1 Then
- searchme$ = Left$(searchme$, Len(searchme$) - 1)
- Else
- result& = SendMessageBystring(FILE1.hWnd, LB_SELECTSTRING,
- |-1, searchme$)
- End If
-
- 7. How do I get the Tab key to be treated like a normal character?
-
- You must set TabStop = False for ALL controls on the active form.
- Then you will be able to insert "tab" (chr 9) characters in
- controls like the text box.
-
- If you feel you need the Tab key to behave "normal" (ie. jump to
- next control) outside this specific control, it is trivial to
- emulate its functionality in code:
-
- Sub Command1_KeyDown (KeyCode As Integer, Shift As Integer)
- If KeyCode = 9 Then
- If Shift = 0 Then
- Command2.SetFocus 'Tab=Next control
- ElseIf Shift = 1 Then
- Command3.SetFocus 'Shift-Tab=Prev.ctrl.
- End If
- End If
- End Sub
-
- ...etc.
-
- 8. How do I make an animated icon for my program?
-
- For an example on how you change the icon for your application as
- it is displayed when it is minimized, see the example REDTOP in the
- \samples\picclip directory for VB/Win 3 Pro. This demonstrates a
- fancy animated icon.
-
- 9. What is passing by reference?
-
- Arguments are either passed by reference or by value. When they are
- passed by value, they cannot be changed by the procedure or
- function they are passed to. They *can* be altered when passed by
- reference, since passing by reference is just passing the address.
-
- Note that procedures are less strict about variable types when you
- use BYVAL. If you declare that your Sub takes a Variant, VB takes
- that seriously and gives a nasty "mismatch error" if you try to
- pass ie. a string to it. Make it ByVal (at the cost of some speed)
- and your sub will be more tolerant.
-
- Also note the following nasty trap: Arguments are passed by
- reference unless enclosed by parentheses or declared using the
- ByVal keyword. [VBWin Language Ref., p. 55]
-
- 10.I get a "file not found" error on the IIF function when I
- distribute by program. Uh?
-
- There's a documentation error, since the manual does not tell you
- that the IIF function requires the file MSAFINX.DLL to be
- distributed with your application. No, IIF is not financial (I
- should know, I study finance right now, or at least I should be
- doing that ;-] ).
-
- 11.Is there any way to pass a variable to a form apart from using
- global variables?
-
- The standard workaround is to put an invisible text box (or caption
- or any other control that suits your use.) on the target form and
- access it by Form.textbox = "value". Then you can use the Change
- event of that control to do anything you want in that form. Also,
- check out the .Tag property which is a "what-you-want" property
- where you can hook any string you want onto a control. This
- property can also be accessed from other modules.
- [Dave Mitton (mitton@dave.enet.dec.com)]
-
- 12.How should dates be implemented so they work with other language
- and country formats?
-
- If you use ie. MM/DD/YY format dates in a program, you will get
- either a runtime-error (ie. month>12) or the wrong date (ie. March
- 12 instead of December 3) when your program is used in Europe. And
- vice versa, of course. Even Microsoft's own example programs (like
- the MAPI sample) make this stupid mistake and fail miserably. Use
- the Format command to make sure you get the date you want. For
- example:
-
- strTodaysDate = Format[$](Now, "Short Date")
-
- As a side note, Microsoft has taken much heat on the newsgroup for
- VB's bad support for internationalization! Just try to make a date
- literal in source code that works everywhere as a little exercise.
- Answer elsewhere in this document. No prizes :-)
-
- 13.Can a VB application be an OLE server?
-
- No. You'll have to use an external DLL/VBX. If you see any
- examples, please tell the newsgroup.
-
- 14.How do I dial a phone number without using the MSCOMM VBX?
-
- The MSCOMM VBX that comes with VB/Pro is great for creating
- communication programs, but it's overkill for dialing a phone
- number. Try the following code:
-
- PhoneNumber$ = "(123)456-7890"
- Open "COM2" For Output As #1 'or COM1
- Print #1, "ATDT" & PhoneNumber$ & Chr$(13)
- Close #1
-
- Ian Storrs <exuian@exu.ericsson.se> informed me that he had
- experienced problems with this when the VB program was run from a
- network drive. A file named "COM1" was created on the disk! This
- trick is probably not a good idea for bigger applications, but it's
- nice for small personal utilities.
-
- 15.I have [several] megabytes of memory. Why do I get an "out of
- memory" error?
-
- Unfortunately, Microsoft has been more famous for memory barriers
- than anything else. This is a late descendant of the infamous 640K
- barrier that has been plaguing us for years. Although Windows
- allows the user to access several megabytes of memory, it uses two
- limited (64K) memory areas called User Heap and GDI Heap for some
- specific data structures. Go to the Help|About box in Program
- Manager to see the percentage of free resources in the *most*
- exhausted heap. If these areas are exhausted, you are out of luck.
- VB programs are unfortunately rather greedy on these structures.
- Windows 4 is supposed to free us from this limitation...
-
- Note that every visible control (ie every button) is a window to
- Windows. Every new control takes up some bytes in the precious User
- heap.
-
- Also, there is another way to run out of memory in Windows, not
- related to VB. Windows requires free Upper Memory Area (UMA, also
- called Upper Memory Blocks, not to be confused with High RAM, which
- is the first 64K of extended memory) to do certain tasks. If you
- use QEMM or DOS 6+ MemMaker and you have many device drivers
- (network, etc) this area may have been filled up before you launch
- Windows. You will then be unable to start applications, even though
- you have plenty of free RAM. The problem can be solved with careful
- memory setup, but this is far beyond the scope of this FAQ.
-
- On a completely unrelated problem: When you run a program with an
- outline control with some ATI graphics cards, it may crash with
- just that error message. (see Knowledge Base Q100194 PRB: "Some ATI
- Video Drivers Hang When Using MSOUTLIN.VBX")
-
- 16.How do I mimic a toggle button?
-
- The only "fix" we know for this problem is to use a picture or
- image control to mimic the action of a button or button3d control.
- You need two bitmaps, one for buttonup and one for buttondown (and
- perhaps one more for inactive state). This is a kluge, we know.
- Look at the button bar used in the MDINOTE sample program supplied
- with VB for an example of this.
-
- 17.How do I get my application on top?
-
- To force a form to the front of the screen, do the following
- command:
-
- Form1.ZOrder
-
- To make the application *stay* on top, put the Zorder command in a
- Timer event repeatedly called, say, every 1000 msecs. This makes a
- "softer" on-top than other methods, and allows the user to make a
- short peek below the form.
-
- There are two different "Zorder"'s of forms in Windows, both
- implemented internally as linked lists. One is for "normal"
- windows, the other for real "topmost" windows (like the Clock
- application which is distributed with MS Windows). The Zorder
- command above simply moves your window to the top of the "normal"
- window stack. To make your window truly topmost, use the
- SetWindowPos API call like this:
-
- 'Make these declares:
- Declare Function SetWindowPos Lib "user" (ByVal h%,
- |ByVal hb%, ByVal x%, ByVal y%, ByVal cx%, ByVal cy%,
- |ByVal f%) As Integer
- Global Const SWP_NOMOVE = 2
- Global Const SWP_NOSIZE = 1
- Global Const FLAGS = SWP_NOMOVE Or SWP_NOSIZE
- Global Const HWND_TOPMOST = -1
- Global Const HWND_NOTOPMOST = -2
-
- 'To set Form1 as a TopMost form, do the following:
- res% = SetWindowPos (Form1.hWnd, HWND_TOPMOST, 0, 0,
- |0, 0, FLAGS)
- 'if res%=0, there is an error
-
- 'To turn off topmost (make the form act normal again):
- res% = SetWindowPos (Form1.hWnd, HWND_NOTOPMOST, 0, 0,
- |0, 0, FLAGS)
-
- 18.Is there a way to break long lines in VB code?
-
- There is unfortunately no line continuation character in VB/Win
- 3.0. Excel 5 VBA does, however, use Space+Underscore (" _") as a
- line continuation character, and we hope this will be included in
- the next version of VB.
-
- There are a few tricks you can use to reduce line length, but
- unfortunately there is very little to do with DECLARE statements
- which can get very long.
-
- Print your source in landscape :-/
-
- 19.How do I remove/change the picture property of a control at design
- time?
-
- Mark the (bitmap) or (icon) text in the property window and press
- Del or Backspace. "No!" I hear you cry, "It doesn't work". Well, it
- does if you first select the object from the combo box at the top
- of the Properties Window, and then immediately afterwards
- doubleclick (or paint over) the "(bitmap)" text and press Del.
- Alternatively, just click on another control, then click back to
- the first control. Now Del works. Who said "bug"?
-
- If you want to paste your picture directly into the VB program by
- pressing Ctrl-V when you are editing the picture property, you will
- have to use a semilar procedure: select the control, select the
- property, press Ctrl-V. If you try it again without deselecting the
- control first (or selecting it from the combo box), it doesn't
- work.
-
- 20.Is a [foo] VBX/DLL available as shareware/freeware?
-
- Part 4 of the FAQ is Adam Harris' excellent "Shareware Custom
- Controls List". Please consult this list before you post this
- question.
-
- The following type of controls are NOT known to be available as
- sw/pd/fw for Visual Basic, only as commercial toolboxes (If you
- feel like making any of these for VB and sharing it for a modest
- fee, you will become very popular!):
-
- a. ZModem communication control/source
-
- b. Rich Text Format-control or other mixed font/word processor
- control (rumours indicate that this will be in the Windows 4
- API, and therefor available from VB)
-
- c. Matrix math
-
- If any of these should be available, please tell us.
-
- 21.How do I make my applications screen-resolution independent?
-
- There are two methods: Either get a custom control that does the
- job for you, or you write lots of complicated code in the Load and
- Resize events.
-
- For the first option, check out VideoSoft's $hareware VSVBX.VBX
- (download VSVBX.ZIP from Cica or mirrors). It has a will of its
- own, as you will experience, but it's generally better than trying
- what is described below.
-
- For the brave (or stupid), try to write "screen resolution-smart
- code" in the form's Load event. If the form is resizable (normally
-
- it should be), you'll have to put some magic into the Resize event
- as well. There are 4 rules of thumb:
-
- a. Do not trust the form's height and width properties. These
- measure the entire form, not the client area where your controls
- are. To see this in action, create a simple applet with the
- only code being in the resize event which resets a line control
- from 0,0 to the form's width,height properties. The top left
- corner is in the client area, the bottom right corner
- disappears. The API call GetClientRect will return the size of
- the client area in pixels. You can use the screen object's
- TwipsPerPixelX and TwipsPerPixelY properties to convert from
- pixels to twips. If that's not enough, GetWindowRect will return
- the actual size of the entire form, client and non-client areas
- combined. GetSystemMetrics will return individual pieces of
- things like border width/hight, caption height, etc.
-
- b. Use the TextWidth and TextHeight properties. You can use them
- off the form if all your controls share the same font, otherwise
- use them off of the given control. I typically do a
- TextWidth("X") and TextHeight("X") to get a value which I use as
- a margin between controls. I grab these values on startup, and
- multiply it by 2, 1.5, .75, .5, .25 to get varying margin sizes,
- depending on how close or far apart I want to space things. If
- your control has an autosize property, you may want to use it,
- and then calculate the maximum width of a control in a given
- "column" of controls on your screen and position all of them
- accordingly.
-
- c. Try not to resize your controls in the resize event. You will
- spawn another resize event in the process. Of course, you can
- use a flag to determine whether the resize event is the original
- event or the spawned one. Using the load event, and setting the
- forms borders to fixed minimizes the amount of work you have to
- do.
-
- d. Make sure you use a consistant scale. I don't even bother with
- the scale properties, but instead just convert pixels (from API
- calls) into twips and be done with it. If you do use scale
- properties, be sure you convert your numbers correctly. I had
- no end of difficulty when I failed to convert into twips with
- one number that was used in a series of calculations to position
- controls. Also be sure all your controls share the same SCALE -
- - another nasty problem I had before I gave up on them
- completely.
- [Thanks to our generous anonymous source "D"]
-
- 22.How do I do Peek and Poke? [++]
-
- VB provides no mechanism for this. There are several 3rd party
- pkgs. which provide this. Also, this often comes up in regards to
- the comm ports and you can many times do what you want with the
- mscomm.vbx.
- [George Tatge (gat@csn.org)]
-
- There's a shareware package for in/out routines but alas not for
- peek & poke.
-
- 23.Why doesn't "my string" & Chr$(13) do what I want?
-
- You need to also add a Chr$(10): "my string" & Chr$(13) & Chr$(10)
- will give you a CR and LF.
- [George Tatge (gat@csn.org)]
-
- 24.How do I prevent multiple instances of my program?
-
- In VB 3, the property App.PrevInstance is set to True if an older
- instance of the program already exist.
-
- The following piece of code, stolen from MS KB article Q102480,
- will activate the old instance and then terminate itself:
-
- Sub Form_Load ()
- If App.PrevInstance Then
- SaveTitle$ = App.Title
- App.Title = "... duplicate instance." 'Pretty, eh?
- Form1.Caption = "... duplicate instance."
- AppActivate SaveTitle$
- SendKeys "% R", True
- End
- End If
- End Sub
-
- As Robert Knienider(rknienid@email.tuwien.ac.at) informed me, this
- piece of code WILL NOT work for non-English versions of MS Windows
- where the word for "Restore" does not have "R" as the underlined
- word. Replace the "R" in the SendKeys line above with "{ENTER}" or
- "~".
-
- Note that you shouldn't prevent multiple instances of your
- application unless you have a good reason to do so, since this is a
- very useful feature in MS Windows. Windows will only load the code
- and dynamic link code *once*, so it (normally) uses much less
- memory for the later instances than the first.
-
- 25.How do I implement an accelerator key for a text box?
-
- You want to use a label caption to identify a text box and to act
- as if it were the text box caption:
-
- Example:
-
- &Label1 [text1 ]
-
- How should I do to set the focus to text1, by typing <ALT>L
-
- Make sure that the TabIndex property for the text box is 1 greater
- than the
- label's TabIndex. Since a label can't have the focus, the focus
- will go to the next item in the tab order, which would be the text
- box.
-
- Here's any easy way to set the TabIndex for a busy form. Select the
- object that should be last in the tab order and then select the
- TabIndex property. Press 0 (zero), click on the next to last
- object, press 0, click on the the next object back, press 0, etc.
- When you're done, all of the TabIndexes will be in order, because
- VB increments all of the higher TabIndexes when you put in a lower
- number.
-
- Many thanks to Jonathan Kinnick and Gary Weinfurther that provided
- the answer
- on the FIDO net echo VISUAL_BASIC.
- [Tiago Leal (Tiago.Leal@p25.f1.n283.z2.gds.nl)]
-
- 26.How do I force a file dialogue box to reread the currect disk? [**]
-
- If you make a simple dialogue box modelled after common dialogue
- (normally you should *use* the common dialogue VBX!), you will
- notice that reselecting the diskette drive will not really rescan
- the disk. Very annoying to change to C:, and to reselect A: just to
- make it read the directory of a new diskette.
-
- To solve this problem, put
-
- drive1.refresh
- dir1.refresh
- file1.refresh
-
-
- in the code for the "Rescan" button (or whatever).
-
-
- D. ADVANCED VISUAL BASIC PROGRAMMING ISSUES
-
-
- 1. How do I tell when an application executed using the SHELL command
- is finished?
-
- Shell() doesn't really return a task handle, it returns an instance
- handle. Any documentation that says otherwise is wrong. But never
- mind that; the answer to your question is to use the API call
- GetModuleUsage.
-
- 'Put this in the general declarations of your form/module
- Declare Function GetModuleUsage Lib "Kernel" (ByVal
- |hModule As Integer) As Integer
-
- 'Here's where you shell out to the other program
- intHandle = Shell("PROGRAM.EXE")
- Do While GetModuleUsage(intHandle) > 0
- DoEvents
- Loop
- [Kenn Nesbitt, Microsoft Consulting Services (kennn@netcom.com)]
-
- 2. How do I access C style strings?
-
- Use the 'lstrlen' and 'lstrcpy' calls found in the Kernel DLL.
-
- 3. How can I change the printer Windows uses in code without using the
- print common dialog?
-
- You can change the printer the VB 3.0 Printer object is pointing to
- programmatically (without using the common dialogs). Just use the
- WriteProfileString API call and rewrite the [WINDOWS], DEVICE
- entry in the WIN.INI file! VB will instantly use the new printer,
- when the next Printer.Print command is issued. If you get the old
- printer string before you rewrite it (GetProfileString API call),
- you can set it back after using a specific printer. This technique
- is especially useful, when you want to use a FAX printer driver:
- Select the FAX driver, send your fax by printing to it and switch
- back to the normal default printer.
- [Hajo Schmidt (hajo@bwl.bwl.th-darmstadt.de)]
-
- It is recommended (and polite, as we're multitasking) to send a
- WM_WININCHANGE (&H1A) to all windows to tell them of the change.
- Also, under some circumstances the printer object won't notice that
- you have changed the default printer unless you do this.
-
- Declare Function SendMessage(ByVal hWnd As Integer,
- |ByVal wMsg As Integer, ByVal wParam As Integer,
- |lParam As Any) As Long
- Global Const WM_WININICHANGE = &H1A
- Global Const HWND_BROADCAST = &HFFFF
- ' Dummy means send to all top windows.
-
- ' Send name of changed section as lParam.
- lRes = SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0,
- |ByVal "Windows")
- [Nic Gibson (nic@skin.demon.co.uk)]
-
- 4. Any tips for speeding up VB?
-
- Who said "code in C"???? ;-)
-
- a. When SHOWing a form with lots of bound controls, have a blank
- frame covering everything. Then, in the Form_Activate event, set
- the Frame.Visible = False. This greatly speeds the display of
-
- the form and hides ugly thrashing as the data controls
- initialize.
- [Christopher Biow (biow@cs.umd.edu)]
-
- b. Try to keep any Global definitions to a minimum. Massive
- numbers of global variables really seem to slow VB Windows down
- (besides chewing up memory). In other words, if you've pasted a
- lot of stuff from the globals.txt file, trim all definitions and
- variables you don't use in your application.
-
- c. Keep the total number of controls and forms used to a minimum
- (you've probably already guessed that).
-
- d. Keep fancy graphics to a minimum (another one you know).
-
- e. Try "pre-processing" in the background (using Do_Events).
- Doesn't really speed anything up, but often there is a lot of
- "idle" time while the user is selecting menu's, buttons and such
- - if you can do some calculations, image loading or whatever
- during this idle time your user perceives the application is
- faster than it really is.
-
- f. Hide often-used forms rather than unloading them. Unloading
- saves memory, but it takes longer to re-load a form than to
- simply "un-hide" it.
- [Tips b to f by Galen Raben (galenr@gr.hp.com)]
-
- The following tip is along the same lines, but with a code sample.
- They are provided by Andy Dingley (dingbat@codesmth.demon.co.uk):
-
- You're limited by the system as to how quickly you can go from
- calling frmMyForm.Show to being able to type into the controls, but
- you can make the form *appear* to display faster. One technique is
- to keep forms loaded, and just switch their visibility on and off.
- This is heavy on resource usage, and doesn't help for the first
- time they're shown.
-
- Most forms have some processing (eg. querying a table to fill a
- list box) that goes on when they're first opened, and this is what
- causes the most serious delay. It's possible to display the form,
- make its controls appear on screen, then do the slow processing
- before finally making the form "live". As the user can see things
- happening, the perceived delay is less obvious.
-
- Include the following code in your form:
-
- Option Explicit
- Dim FirstActivation as integer
-
- Sub Form_Activate
- DoEvents 'Allow the _Load event to be seen on screen
- If FirstActivation Then
-
- ' Do all the slow loading stuff here
- If FillComboBox <> 0 Then
- Unload Me 'If it all goes horribly wrong, then you
- 'can call Unload from an _Activate event
- '(Which you can't do from the _Load event)
- End If
- FirstActivation = False
- End If
- Screen.MousePointer = DEFAULT
- End Sub
-
- Sub Form_Load
- FirstActivation = True
- End Sub
-
- Show the form by using:
-
-
- Screen.MousePointer = HOURGLASS
- frmMyForm.Show MODAL
-
-
- Bruce Garrett (bruceg@access2.digex.net) had the following tips
- from his VBITS 93 notes:
-
- - Polling a control for its properties directly is 10 to 20
- times slower then placing the property values you need into
- variables and testing the value of the variables.
-
- - Swap tuning: Modules are not loaded until used; put related
- code in the same modules, reduce the number of intermodule
- calls and keep modules small.
-
- - Binary file I/O is faster then Text/Random.
-
- There was also a lot of discussion about "apparent" speed i.e: how
- it looks on the screen as opposed to how fast it's chugging
- internally. It was noted that the cute little flashing menu items
- and exploding windows in the Mac amounted to a little razzle-dazzle
- to distract you from how long it took to actually load something
- and get it on the screen. Keeping all your forms loaded but hidden
- until needed was suggested. Also the use of progress indicators
- and a simple quickly loaded and drawn startup form. Also preloading
- data you expect to need.
-
- 5. How do I speed up control property access?
-
- Instead of using a property in a loop, you will be better off using
- a normal variable in the loop and then assign the variable once to
- the property afterwards. Also, when reading a property, you should
- read it once into a variable instead of using it in a loop.
-
- Sometimes it is not possible to simply put contents of a property
- into a variable. For example, if you are using a list box or you
- need to conserve memory. In these cases you can send the
- WM_SetRedraw message to the control to prevent redrawing. You can
- typically increase the speed 6-10 times - or even more.
-
- 'Add the following declares:
- Declare Function SendMessage Lib "User" (ByVal hWnd As
- |Integer, ByVal wMsg As Integer, ByVal wParam As
- |Integer, lParam As Any) As Long
- Const WM_SetRedraw = &HB
-
- 'Add this to your code:
- Result% = SendMessage(Text1.hWnd, WM_SetRedraw, 0, 0)
- 'redraw off
- 'Do your stuff here!
- Result% = SendMessage(Text1.hWnd, WM_SetRedraw, 1, 0)
- 'redraw on
-
- This same method applies to list boxes and other controls.
-
- 6. How much gain in performance will I get if I write my number
- crunching routines in C instead of Visual Basic?
-
- Probably the best solution to the number crunching problem is to
- write the number crunching routines as a custom control or a DLL,
- and plug it into a VB app. VB interface handling is not
- significantly slower than, say C++, and most of the wait is
- associated with Windows.
-
- Some real world experience speaks volumes about this one:
-
- I wrote some time consuming code in VB to solve a combinatorical
- (does this word exist in English?) problem. The code consists of
-
- one main recursive function, which calls itself very often. It took
- a night to compute a certain problem. I was rather disappointed and
- then decided to write the central routine in C++. It was a 1:1
- transcription. The routine was compiled with the MS C++-Compiler.
- It took only 22 Minutes for the same problem. Amazing, isn't it?
- The routine doesn't do any floating point arithmetic, only integer,
- and handles some arrays. The PC was a 33MHz 486. And the second
- amazing thing is, that a IBM RS6000 (560)-Risc-machine needed 17
- Min for the same code. I was the only one on the machine. I thought
- it should be much faster. The MS C++ seems to make very fast,
- optimized code. The optimization was configured to make fast code.
- [Christoph Steinbeck (steinbeck@uni-bonn.de)]
-
- 7. How do you make a TEXTBOX read only? Or, how do I prevent the user
- from changing the text in a TEXTBOX?
-
- There's a lot of ideas on this one. You can grab the _KeyPress and
- _KeyDown events and set them to zero. However, the best idea is to
- use the Windows API SendMessage function to tell the control to
- become read-only:
-
- 'After making the following declarations...
- Global Const WM_USER = &H400
- Global Const EM_SETREADONLY = (WM_USER + 31)
- Declare Function SendMessage Lib "User" (ByVal hWnd As
- |Integer ByVal wMsg As Integer, ByVal wParam As
- |Integer, lParam As Any) As Long
-
- 'Then Try:
- SendMessage(Text1.hWnd, EM_SETREADONLY, 1, 0)
- [Pete Jones (pjones@csi.compuserve.com)]
-
- This will still allow the user to copy *from* the text box. If you
- need to disable this (why?), steal the Ctrl-C in the _KeyPress
- event.
-
- 8. How can I create a VBX?
-
- VBXs (Visual Basic eXtensions) are practically always written is C
- (Borland C++, but mainly MS VC++). You should refer to the _Control
- Development Guide_ (in VB Professional Features Vol. I) and any
- relevant documentation for your compiler. Followup questions should
- normally be directed to comp.os.ms-windows.programmer.* or
- comp.lang.c*.
-
- There are some example VBX's with C code supplied with VB3 Pro.
- You'll find them under the directory [VB]\CDK.
-
- 9. How do you change the system menu (on the Control-Menu Box)?
-
- You can turn off the minimize and maximize menu options by changing
- properties, but what if you need to remove the "close" option?
-
- 'Make the following declares.
- Declare Function GetSystemMenu Lib "User" (ByVal hWnd
- |As Integer, ByVal bRevert As Integer) As Integer
- Declare Function RemoveMenu Lib "User" (ByVal hMenu
- |As Integer, ByVal nPosition As Integer, ByVal wFlags As
- |Integer) As Integer
- Global Const MF_BYPOSITION=&H400
-
- 'Use the following code to remove the "close" option.
- SystemMenu% = GetSystemMenu (hWnd, 0)
- Res% = RemoveMenu(SystemMenu%,6, MF_BYPOSITION)
- '(also remove the separator line)
- Res% = RemoveMenu(SystemMenu%,6, MF_BYPOSITION)
-
- Adding menu items to the control menu is more complicated, since
- you need to respond to the events triggered when the user selects
-
- the new options. The newest Message Blaster (msgblast.vbx, see
- details in beginning of FAQ about how to get files) contains
- example code.
-
- 10.How do I play MID, WAV or other multimedia files?
-
- Use the MSMCI.VBX, provided with VB/Win Pro 3.0. You can also
- declare and call the MM-functions manually:
-
- Declare Function mciExecute Lib "MMSystem"
- |(ByVal FileName as String) As Integer
-
- Sub Form1_Click ()
- iResult = mciExecute("Play c:\windows\mkmyday.wav")
- End Sub
-
- 11.How can I call a 'hidden' DOS program from VB?
-
- If you run a DOS program minimized using the SHELL command, it will
- never complete. This is because DOS tasks by default are NOT setup
- to run in the background. The easiest way to get around this is to
- make a PIF file for the program you need to run with the
- "Background" option checked. Then SHELL to the PIF file to run the
- DOS program and it will return control to your VB application when
- it terminates.
-
- Tip: If you edit or replace the _DEFAULT.PIF file in the Windows
- directory to allow execution in background, this will apply to all
- DOS boxes that is not run with it's own .pif!
-
- 12.How do I do drag & drop between applications? [++]
-
- MSGBLAST.ZIP (the famous Message Blaster by Ed Staffin and Kyle
- Marsh) available on Cica and mirrors tell you *everything* you want
- to know about this and other advanced stuff. This is now
- (inexpensive) shareware, but the older freeware version is still
- supposed to be available. Get the file mentined above for more
- info.
-
- Short glossary for the confused ones :-)
- Drag & Drop Client: the form you drop objects to/on
- Drag & Drop Server: the form you drag object(s) from
-
- 13.How do I use GetPrivateProfileString to read from INI files? [++]
-
- There's a good example of accessing *.INI files in the Knowledge
- Base, but here's the basic idea:
-
- 'You declare these API function as usual:
- Declare Function GetPrivateProfileString Lib "Kernel"
- |(ByVal lpApplicationName As String, ByVal lpKeyName
- |As Any, ByVal lpDefault As String, ByVal
- |lpReturnedString As String, ByVal nSize As Integer,
- |ByVal lpFileName As String) As Integer
-
- 'Then in your code you do like below:
- strIniFile = "WIN.INI"
- strSection = "MyProgram"
- strKey = "Language"
- strDefault = "English"
- iLength = 70
- strReturn = String$(iLength, " ") 'Pad the string first!
- iResult = GetPrivateProfileString(strSection, strKey,
- |strDefault, strReturn, iLength, strIniFile)
-
- WARNING: Be aware that there was an ERROR in the Windows 3.1 API
- documentation that came with VB. Here's the scoop:
-
- Knowledge Base article Q110826 (DOCERR: GetPrivateProfileString
- Declaration Incorrect in API) corrects a documentation error for
- the GetPrivateProfileString function call as described in the
- Windows version 3.1 API Reference help file that shipped with
- Microsoft Visual Basic version 3.0 for Windows. The CORRECT
- declaration is as follows:
-
- Declare Function GetPrivateProfileString Lib "Kernel"
- |(ByVal lpApplicationName As String, ByVal lpKeyName
- |As Any, ByVal lpDefault As String, ByVal
- |lpReturnedString As String, ByVal nSize As Integer,
- |ByVal lpFileName As String) As Integer
-
- Note that the "ByVal" keyword was omitted from the second parameter
- in the online reference. This means that the function is passing
- the second parameter (lpKeyName) by reference. It needs to be
- passed by value.
-
- The most common problem that occurs when using the incorrect
- declaration is that when the function is called, it returns a copy
- of "lpdefault" in the "lpReturnedString" parameter instead of the
- actual value referenced by KeyName.
-
- OOPS: As P. Wierenga (pwiereng@sol.UVic.CA) told me, the same doc
- error applies to Writeblablabla:
-
- DOCERR: WriteProfileString Declaration Incorrect in API Article ID:
- Q115328
-
- The correct declaration is as follows:
-
- Declare Function WritePrivateProfileString Lib "Kernel"
- (ByVal lpApplicationName As
- String,
- ByVal lpKeyName As Any,
- ByVal lpString As Any,
- ByVal lplFileName As String) As
- Integer
-
- (all on one line of course!)
-
-
- 14.How do I implement Undo?
-
- For most controls, you will have to keep track of changes yourself.
- There's no magic involved, just some coding. However, if you use
- the standard Text box or Combo box, Windows provides a "free" undo
- function for you!
-
- 'Do the following declares:
- Declare Function SendMessage Lib "User" (ByVal hWnd As
- |Integer, ByVal wMsg As Integer, ByVal wParam As
- |Integer, lParam As Any) As Long
- Global Const WM_USER = &h400
- Global Const EM_UNDO = WM_USER + 23
-
- 'And in your Undo Sub do the following:
- UndoResult = SendMessage(myControl.hWnd, EM_UNDO, 0, 0)
- 'UndoResult = -1 indicates an error.
-
- 15.How do I create a window with a small title bar as in a floating
- toolbar?
-
- Download the MSGBLAST VBX from ftp.microsoft.com (filename "8-
- 3.ZIP") or (better) from ftp.cica.indiana.edu. The example files
- provide an example of a form with a small title. When you see it,
- you'll understand why I haven't include a full explanation here!
-
- 16.What is Pseudocode?
-
- VB/Win does not generate machine code like most compilers do.
- Instead it creates what is called pseudocode (a real misnomer,
- IMO). A good explanation is given below:
-
- A bit of history: the original P-code was an instruction set for a
- "virtual Pascal" machine. This came with a portable Pascal compiler
- written at ETH in Zuerich. The portable compiler produced
- instructions for this phony machine which had an instruction set
- ideally suited to the stack and heap management of Pascal. To
- executed portable Pascal programs, you had two choices: either
- write an interpreter for P-code, or translate the small set of P-
- code instructions (there were about 80) into assembler; assemble
- it; and run it at native speed. Thus "P-code" originally stood for
- "Portable" or "Pascal" code. The broader meaning, "pseudo-code"
- came later. P-code was widely popularized by the UCSD Pascal
- system, a small workstation that was implemented entirely in Pcode
- and interpreted. It was sold for some years, and one company even
- re-did the microcode for a PDP-11 microchip to interpret P-code.
- The original Borland Turbo Pascal had obvious similarities to the
- UCSD system although it was not interpreted. The dialect was
- virtually identical. Today P-code is used extensively in Microsoft
- apps, for two reasons. First, it is much more compact than native
- code; so the apps are smaller. Second, having an interpreter at the
- core of an app makes it much easier to customize and extend. That
- is why VB is becoming the heart of the MS major apps. It is simply
- not true that P-code apps run much slower than native apps. The
- slowdown is determined by the granularity of the interpreted
- routines. If every little thing is an interpreted op, the slowdown
- might be as much as 3-to-1 for the 80x86 architecture, or about 2-
- to-1 for the Motorola 68000 family (which is better suited to
- writing interpreters). But in practice, modern P-code systems have
- large-scale instructions, each of which is executed by a big
- compiled subroutine. These subs run at native speed, so the
- overhead of the interpreter is occasional at worst.
- [Roger E. Ison (r_ison@csn.org)]
-
- It is also possible that since the code may not need recompilation
- to run on other platforms *if* the run-time interpreter is first
- ported, VB applications can become very portable. This depends on
- Microsoft's long-term plans.
-
- A note on the word "pseudocode": I wrote above that it is a
- misnomer, and I stand on that. Pseudocode is *really* the pascal-
- like (mostly) explanation of an algorithm that is intended for
- human readers, not computers. But since somehow the term pseudocode
- stuck to the psaudo-machine-code created by VB the word is used
- here.
-
- 17.Does VB support pointers to functions?
-
- No, it does not.
- [George Tatge (gat@csn.org)]
-
- 18.How do I program the Novell NetWare API from VB? [++]
-
- Tom Tregilgas (Tom.Tregilgas@InfoB.unisg.ch) had a lot of
- information on this one. Normally I leave it to the other FAQ parts
- to list books & how-to-get-info's, but since this topic is very
- specific and more NetWare than VB I include all the stuff here for
- your convenience:
-
- If you are interested in seeing how Visual Basic can be used for
- NetWare programming, obtain the following files from your friendly
- neighboorhood Novell FTP Mirror site.
-
- Mirror sites are (according to ftp.novell.com):
-
- Novell Germany ftp.novell.de
- Netherlands ftp.rug.nl
- United Kingdom ftp.salford.ac.uk
- Logan, Utah netlab2.usu.edu
- New Zealand tui.lincoln.ac.nz
- Tuscaloosa, Alabama risc.ua.edu
- Ottowa, Ontario, CA novell.nrc.ca
- Boston, Mass bnug.proteon.com
-
- novlib\11\nivb.zip Netware Interface for Visual Basic
- novlib\11\nwtest.zip NetWare Test for Visual Basic
-
- There are also two Novell App Notes on the subject of using NetWare
- with Visual Basic (although this is _NOT_ supported by Novell...)
- which are:
-
- October 92 Interfacing Visual Basic for Windows and NetWare
- July 93 A NetWare Interface for Visual Basic
-
- The AppNotes can be obtained by contacting the Novell Research
- Order Desk, FAX: +1 303 294-0903, Voice 800 377-4136, +1 303 297-
- 2725. Address as follows:
-
- Novell Research Order Desk
- 1601 Park Avenue West
- Denver, CO 80216-5199
-
- AppNotes are $95/year ($135 outside US)
-
- Here are a few books which might help you out to figure the calls
- out:
-
- Windows Development on NetWare Systems, Lori Gauthier and Sue
- Whitehead (c) 1994, Windcrest, Blue Ridge Summit, PA 17294-0850
- (McGraw-Hill) $34.95 Comes with disk This book also tells you how
- to "upgrade" to the currently supported SDK calls
-
- NetWare System Interface Technical Overview, Novell (c) 1990,1989
- (Addison-Wesley), $32.95 (describes Novell's C Network Compiler
- API's)
-
- Visual Basic Programmer's Guide to the Windows API, Daniel Appleman
- Ziff-Davis Press, 5903 Christie Ave, Emeryville, CA 94608, $34.95
- Comes with disk
-
- It should be mentioned that the APIs included with the NIVB are
- _not_ current, and for this purpose, you should get the Novell SDK
- kit. Also, Novell will not support NIVB, but you can sometimes get
- some helpfrom Compu$erve, or from others on the Infobahn <g>
-
- Good luck!
-
- p.s. It behooves you to become a member in the PDP (Professional
- Developer's Program) since you get the AppNotes (& Bullets!)
- for...free.
-
- p.p.s. Novell does NOT support the NIVB...
-
- p.p.p.s. Also, no docs come with it. You'll probably need the
- Client C SDK kit to be able to really _use_ the code.
-
- p.p.p.p.s. To make things even better, the calls in NIVB are fairly
- old, and not of the Client C SDK kit variety. However, there _are_
- books which could help you out, e.g. "NetWare System Interface
- Technical Overview", by Novell. ISBN:0-201-57027-0, published by
- Addison-Wesley Publishing co, $32.95 US, $42.95 in Canada.
-
- Update:
-
- AppNotes are dead, however, Develper Notes live on. There is one
- article about NetWare programming with Visual Basic here:
-
- July/Aug 94 NetWare Programming in Visual Basic:
- Using Apiary's NetWare Client SDK for Visual Basic
-
- 19.Some Visual Basic 4 rumours
-
- First, we have no special information. This is just rumours,
- guessing, gossip! But since there are many questions about this on
- the newsgroup, *and* Microsoft gives these controlled leakages
- through their beta testers, we bring on some of it (Please, don't
- start discussing NDA's on this group again!):
-
- a. Two versions: 32-bit and 16-bit
- Like Visual C++ 1.5, VB 4 will come with compilers for the 16-
- bit API from Windows 3.1 as well as a real 32-bit compiler (or
- pseudocompiler) for Windows 4 (Chicago) bundled together.
-
- b. New features will probably be inherited from VBA
-
- 1) Line continuation character " _" (space+underscore)
-
- 2) WITH statement, known from Pascal, to save typing and make
- code cleaner. An example:
-
- With Form1
- With Text1
- Bold = true
- FontName = "New Times Roman"
- End With
- End With
-
- 3) FOR EACH .. NEXT statement allows you to make changes to a
- group of objects at once better than FOR..NEXT. Object
- groups are also something you may have to work closer with
- in VB4.
-
- 4) An OPTIONAL statement allows you to leave some Variant
- parameteres undefined when calling a user-defined sub or
- function. Also in VBA is an ARRAY function that returns an
- array form a list supplied as parametres, and a special
- optional ParamArray optional parameter of Variants.
-
- 5) Boolean data type. Integer does the job, but this type can
- preserve space if Microsoft codes it right.
-
- 6) Byte data type? No, VBA does not support this. We can
- dream, however.
-
- c. VBX is dead. Long live OCX!
-
- You may not feel for celebrating this either, but the 32 bit VB
- 4 will not support the old 16-bit VBX'es. The 16-bit version of
- VB 4 will support them for backwards compatibility, but be aware
- that OLE 2 and OCX is the way of the future, at least if
- Microsoft gets it as they want.
-
-
- E. CALLING THE WINDOWS API AND DLLs IN GENERAL
-
-
- 1. What is the Windows API?
-
- The Windows API (Application Program Interface) is a collection of
- Dynamic-Link Libraries (DLLs) that do most of the common things in
- Windows. Calls to the Windows API gives you access to routines that
- do things like drawing menu bars, manipulating bitmaps, playing
- sound files, and pretty much every other function of Windows.
-
- 2. How do I call a DLL?
-
- Basically, you declare a DLL procedure which you can call in your
- VB program which in turn passes data to and/or retrieves data from
- the DLL. You should read the section of the VB manual that talks
- about calling DLLs ("Chapter 24 Calling Procedures in DLLs" in the
- VB 3.0 Programmer's Guide). This chapter covers the basics of using
- the Windows API DLLs and calling DLLs in general. Beyond that you
- may want to find a good book on this subject since it is too large
- to cover here (see the Book Listing in the Appendix of the General
- FAQ - Part 1). Don't be too intimidated! Using DLLs (especially
- many of the Windows API functions) is quite easy, once you learn
- how to call them. In fact, many of the newer DLLs include VB-
- compatible modules!
-
- 3. What about DLL calls that require callbacks?
-
- VB does not support callbacks, but various extensions can help.
-
- Dan Appleman's "Visual Basic Programmer's Guide to the Windows API"
- comes with a floppy disk which code samples and tools. It also
- includes a VBX which supports the callbacks which many API calls
- require. Dan is also founder and president of Desaware which sells
- more extensive tools, including SpyWorks, for VB developers.
- [Walter Hill (whill@netcom.com)]
-
- 4. Tips for calling DLLs (such as the Windows API)
-
-
- a. Using the BYVAL keyword is critical. Using it when you're
- supposed to call by reference and (more common) not using it
- when you are to give a value to the external function are the
- single most common mistakes. Wrong calling convention can often
- result in a General Protection Fault (GPF) or, even worse,
- corruption of another applications' data.
-
- b. Check return and parameter types. For return types, a C function
- declared as "void" means you use a Sub not a Function.
-
- c. Initialize strings by padding it to the necessary length! If you
- pass a string that is too short to the API it will happily write
- past the end of the string and possibly corrupt data.
-
- d. Use Option Explicit. A typing error that results in a bug in the
- VB source will occasionally cause a GPF when you call external
- code.
-
- e. It's a jungle out there! Check parameter values as there is no
- type checking outside VB. If you make a mistake, you'll often
- get a GPF.
-
- f. Save before you run! You may even need to restart Windows after
- a GPF, since DLL's often aren't unloaded properly. As a second
- option you can check out WPS (Windows Process Status) which is
- distributed with VB/Pro and placed in the CDK directory. This
- utility allows you to kick out any module (EXE, DLL) from memory
- (shooting yourself in the foot if you want to. WPS is a nice way
- to find out what DLLs are actually used, but save your work
- first!).
-
-
- F. VISUAL BASIC AND DATABASES
-
-
- 1. Why can't I use an index with my VB accessed database?
-
- There is a mistake in the docs which says you can set the active
- index for a recordset. You can't. The data control uses the primary
- key for tables and physical order (I think) for dynasets.
-
- [Nic Gibson (nic@skin.demon.co.uk)]
-
- 2. Why does my compiled VB database app generate an error when it ran
- just fine in the design environment?
-
- You can thank Microsoft for documenting this topic so poorly. When
- you compile your VB database application, you must also have an INI
- file for it which provides the correct pointers to the appropriate
- database drivers. Therefore, if your application is named
- "INVOICE.EXE", you will need to have a properly configured
- "INVOICE.INI" file in your Windows directory. The file,
- EXTERNAL.TXT, that came with VB should explain all about it.
-
- 3. Is the Access Engine and Visual Basic Pro good enough for database
- work?
-
- That, of course, depends. Generally the answer is "yes", but you
- may need some third-party add-on products.
-
- These are the major weaknesses of VBPro's database functions:
-
- a. Limited data controls: No add, delete or search button; no bound
- list box or masked edit control and - the worst - no bound grid!
-
- b. No run-time query builder ("how good is your user in SQL?") or
- report builder.
-
- c. No direct advanced control of the Access 1.1 (or 2) Database
- Engine (ie. security, optimization, etc).
-
- The good news is that lots of companies are willing to sell you
- products which address one or more of the above weaknesses.
-
- Also, if you build a database application with advanced database
- relations, it can be a good idea to build the database itself with
- Access and the front-end with VB.
-
- 4. How do you avoid the "Invalid use of null" error when reading null
- values from a database?
-
- If you try to retrieve a null value (empty field) from a database,
- you will get the error: "Invalid use of Null". Here is one way to
- get around this problem:
-
- I've worked around this problem with the following code:
-
- TextBox.Text = MyTest.Fields("TestFld") & ""
-
- This code converts the Null-Value into an empty string.
- [Ralf Metzing (rmm@dragon.stgt.sub.org)]
-
- 5. What is "NULL"?
-
- Contrary to popular belief, Null is not nothing. It's even less
- than nothing. 8^)
-
- The VB documentation describes all the horrors of misunderstanding
- the infamous NULL. Since people don't read the documentation, we
- feel like informing that
-
- If ThisVarIsNull = NULL then DoSomething
-
- will *always* fail, and the DoSomething can't possibly be executed.
- You *must* use IsNull(ThisVarIsNull) which will return True if the
- var is Null (phew!).
-
- If you want to find out why someone came to think of this strange
- value, read some relational database theory.
-
- 6. How can I access a record by record number?
-
- Use a counter or index field and access the record with this.
-
- It is *impossible* to ask a relational database system to give you
- ie. "field number 3 in record number 10" since by definition a
- relational database does not have row or column numbers. Databases
- allowing direct access like that is not even remotely relational.
-
- Access (and therefore, VB) is about as close to a real relational
- database system as you can get.
-
- 7. How about Access 2.0 compatibility?
-
- You need the compatibility layer availability. The file COMLYR.EXE
- is in the MSBASIC library on Compuserve. This file provides all the
- items necessary for compatibility between VB 3.0 and Access 2.0.
- [Fred Griffin (72321.3230@compuserve.com)]
-
- The file COMLYR.EXE can be downloaded from ftp.microsoft.com. It is
- located in the directory /softlib/mslfiles.
-
- 8. Tips for VB database programming:
-
-
- a. Use Access and QBE. Once it's "working" (even if the parameters
- are hardcoded), then open up View.SQL and copy the stuff from
- the SQL window into your VB code. If you need to insert VB
- variables, try testing this under Access by using parameters
- instead. They're then nice & easy to spot when it comes to
- converting into VB - I always call my parameters "PR_xxxx", so I
- can just search my VB code for this to find any instances that
- I've missed.
-
- b. It never works first time. So put an error handler into your VB
- code that copies the contents of SQLStr onto the clipboard,
- should the query fail. Now it's quick & easy to switch back to
- Access, find a scratch query and paste the erroneous SQL into
- that. It's *much* easier to debug a SQL query in Access, after
- the variables have been merged in, than it is to do it blind
- from VB.
-
- c. Use carriage returns to break up your SQL. One before each
- reserved word is sensible. They're not significant in SQL. I
- assume you're not stupid enough to put them in the middle of
- field names - unfortunately Debug.Print is!
-
- d. When merging in the contents of a variable (building a SQL query
- in a VB string), it should *always* be surrounded by an
- ampersand and 3 double quotes, or an ampersand and 2 mixed
- quotes, depending on your local conventions:
-
- SQLStr = SQLStr & "WHERE Username <= """ & Username$ """ "
-
- or
-
- SQLStr = SQLStr & "WHERE Username <= '" & Username$ "' "
-
- e. If you're using dates, then it will *always* be one quote, a
- hash and an ampersand:
-
- SQLStr = SQLStr & "WHERE Start_Date <= #" &
- |Format$(CutOffDate,"Long Date") & "# "
-
- f. Another tip with dates is to format them with the long date
- format, not the short date. This is then safe against the
- transatlantic reversal of month & day position.
-
- g. If you're merging in a field/table name, enclose it in square
- brackets. That way the SQL will still be valid if the variable
- contains spaces:
-
- SQLStr = "SELECT * FROM [" & TableName$ "] ;"
-
- When building SQL strings in VB, then you'll often do this on
- several lines, concatenating SQLStr with the new string. If you
- leave a space at the end of every string, then you can guarantee
- you won't have problems with the text from successive lines
- running into each other.
-
- h. If you're using Access 1, you'll keep running into the 1024
- character limit on the length of a SQL string. Keep the table &
- field names short, especially if many JOINs are concerned. Using
- underscores in names is shorter than spaces, as you don't need
- the extra 2 characters for the square brackets around them. If
- your SQL is slightly too long, then you'll probably see a
- "Missing semicolon" error, even though the semicolon is
- obviously there (To you, anyway!).
-
- i. Making a QueryDef is a complicated process that is often slower
- than executing the query ! Don't mess with the .SQL property, as
-
- that is equally slow (Access needs to do a lot of work to turn
- SQL into its internal query format). Two ways around this: Use
- ready-built queries, written with Access. If you need to merge
- in values from variables, then use a query with parameters.
- Setting parameter values is quick to execute.
-
- j. If you really need to build SQL on the fly -- you need to build
- an ad hoc query, or to supply table or field names (which can't
- be done with query parameters), then try using:
-
- database.Execute SQLStr
-
- As this doesn't build a QueryDef, then it's quick.
- [All tips a to j by Andy Dingley(dingbat@codesmth.demon.co.uk)]
-
- 9. How come I get a "No Current Record" error when I use a a Data
- Control on an empty table?
-
- Well, this is a "feature" courtesy of Microsoft. KB article
- Q106494 explains this in detail. Basically, the workaround is to
- add an empty record to the table before the user can do anything
- (or before you try to do any Moves on the Table).
- [George Tatge (gat@csn.org)]
-
- 10.How can I speed up my VB database application?
-
- KB article Q109830 gives some hints. Things you should do include:
-
- - Use Snapshots when possible.
- - Use transactions whenever possible.
- - Use Dynasets when possible.
- - Use SQL action queries when possible.
- [George Tatge (gat@csn.org)]
-
- 11.How do I get a bitmap picture in a field in an Access database?
-
- See p.466 of the Visual Basic (3.0) Programmer's Guide. It contains
- a section called "Using Bound Picture Box and Image Controls".
- Basically you have to bind the VB PictureBox to a field in the
- Access DB, set the .Picture property in the PictureBox, and then
- move to the next record or something. VB will then store your
- picture in Access in a form in which it can be retrieved by VB in
- the future.
-
- If you store the pictures in Access directly (using Access), VB
- won't be able to read them (using VB 3.0 and Access 1.1).
-
- You can also store the picture's filename as a text field in the
- database and use LoadPicture() to load that file into the VB
- PictureBox.
- [Tim Shea (shea@marcam.com)]
-
- 12.What is "Reserved Error -1209"? [**]
-
- You will get a Reserved Error [-1209] ("There is no message for
- this error")
- when your database is corrupted. Try opening the database using MS
- Access;
- if it's corrupted you should get the option to repair it.
- [Joe Abley (joe_abley@originuk.demon.co.uk)]
-
- You should also compact it, after repair. I recommend you add the
- following to your File menu on your main form:
-
- Case ...
-
- RepairDatabase Curentdatabasename
-
- Case ....
-
-
- On Error resume next
- Kill "temp.MDB"
- Name curentdatabasename as "temp.mdb"
- on error goto errcompact
- compactdatabase "temp.mdb", Currentdatabasename
- kill "temp.mbd"
- exit sub
-
- errcompact:
- msgbox "compaction failed"
- name "temp.mdb" as Currentdatabasename
-
- Case ...
-
- [Ayn Shipley (ashipley@hookup.net)]
-
- 13."Cannot perform operation. illegal.." with Paradox 3.5 table(s)
- [**]
-
- Your Paradox table must have a primary key, or it will be read-only
- no matter what you set its properties to.
- [Ayn Shipley (ashipley@hookup.net)]
-
-
- G. DISTRIBUTING VISUAL BASIC APPLICATIONS
-
-
- 1. What are some tips for using Setup Wizard?
-
- There were loads of bugs in the setup utilities supplied with VB3.
- Be sure to get the newest version of SETUPKIT (usually called
- SETUPK.EXE or -.ZIP). It is available from the sources listed in
- the beginning of this document, and in the General FAQ.
-
- Alternatively, if you have the older versions, you may have to
- manually remove the line referring to OLE2UI.DLL in the file
- SETUPWIZ.INI. See later in this document for dates of newest files
- on ftp.microsoft.com.
-
- Follow the instructions in SETUPK.TXT exactly. The files actually
- belong in two separate directories. Not placing them correctly can
- create strange and unusual side effects -- none of them good(!)
-
- Set all involved EXE, DLL and VBX files to Read-Only so that the
- setup program doesn't modify them.
- [Charles F. Mulks (21667cfm@msu.edu)]
-
- A *very* good tip. Actually, make all executables on your system
- read-only. If not, you can get a sharing violation if you try to
- run the same DOS executable twice at the same time.
-
- Also, the source code for a SETUP program is *included* with VB3
- Pro. It is quite trivial to tailor it to your specific needs.
-
- The question remains: Is SetupWiz good? No! Good enough? Perhaps.
-
- 2. Are there restrictions on what I can distribute with my VB program?
-
- The documentation tells what parts of the Visual Basic kit you can
- freely distribute: the VBX files, some DLL's and what the SetupKit
- includes on your distribution diskettes. Reading software license
- agreements may be more boring than asking the newsgroup, but is
- nevertheless a good idea. 8^)
-
- There have been some rumours on the newsgroup that you can't
- redistribute programs written with VB freely. This is nonsense. All
- applications created with VB can be redistributed freely without
-
- royalties (as long as you don't distribute proprietary external
- files).
-
- The rumours probably originated when Microsoft announced that they
- will not sell kits allowing third-party software to include the
- Visual Basic for Applications (VBA) system.
-
- 3. What alternatives to setup wizard do I have?
-
- Perhaps the best one is to simply modify the setup app which is
- supplied with VB. Look in your VB directory for the setupkit\
- setup1 directory. There you will find everything you need to do a
- complete setup program. This sample setup is coded to install a
- few sample app files and create a program group. You can comment
- out those lines and change to your files and program mgr. group.
- There are also a few global variables you will want to change. All
- of this is contained in the comments in the code.
-
- Using this, and the distribution information in the manual telling
- you about which files to distribute with your app will make things
- much easier than using the setup wizard (IMNSHO).
-
- There are also several third party setup products available.
- [George Tatge (gat@csn.org)]
-
- 4. Do I need to worry about users who have Progman replacements such
- as Norton Desktop and PC Tools?
-
- Earlier versions of those products and some others do not respond
- properly to the DLL commands to create groups and items. More
- recent versions do. All you can do in this case is to include some
- information in your readme.txt file that instructs users of those
- products to shut them down and start up program manager before
- installing.
- [George Tatge (gat@csn.org)]
-
- 5. Can I distribute my app without vbrunXXX.dll?
-
- If you are sure that your users have it or can get it, you can
- easily distribute your app without vbrunXXX.dll. Simply remove the
- file from your distribution disk or zip file and and ALSO remove it
- from the setup.lst file.
- [George Tatge (gat@csn.org)]
-
- 6. Why won't my setup program install commdlg.dll et. al.?
-
- There are a couple of DLLs that are almost always in use by
- windows. Commdlg.dll is the most common example. When faced with
- this problem, there is no easy way out. The full explanation is
- several pages long and beyond the scope of this FAQ. The general
- idea is as follows:
-
- Your setup program will need to create a .BAT file to expand and
- then copy these files. Then, it will need to shutdown Windows
- (see ExitWindowsExec API call) and run the .BAT file. Then it will
- need to restart windows and continue your setup program. Your
- setup program should delete the temporary .BAT file that is no
- longer needed.
- [George Tatge (gat@csn.org)]
-
- 7. Where do I install VBXs and DLLs?
-
- PLEASE- this is one place where everybody's life is much easier if
- you will follow Microsoft's recommendations. All PUBLIC VBXs and
- DLLs should be installed in the windows/system directory! A
- "PUBLIC" DLL or VBX is any which can be purchased on the open
- market. In other words, if another VB programmer might possibly
- use the same VBX or DLL, install it in the
- system directory.
-
-
- If you have written private VBXs or DLLs that will never be used by
- any program but yours, you can install them in the same directory
- where you install your application files.
-
- There are lots of good reasons for doing this, but it makes a short
- novel to rehearse them all.
- [George Tatge (gat@csn.org)]
-
-
- H. MISCELLANEOUS TIPS AND INFORMATION
-
-
- 1. Multiple identifiers after the DIM statement can be confusing
-
- Some programmers with background from Pascal can try the following
-
- Dim iA, iB, iC as Integer
-
- and think that all these 3 variables end up as Integer. In fact,
- the first two end up as default data type, normally Variant.
-
- Instead you should do
-
- Dim iA as Integer
- Dim iB as Integer
- Dim iC as Integer
-
- which takes up more space, but gives you room to comment your
- variables (hint, hint); *or*
-
- Dim iA%, iB%, iC%
-
- which does the whole job.
-
- 2. "Clean up" your project before final EXE compilation.
-
- When you are ready to compile your VB project into your 'finished'
- EXE, be sure to save the project files, exit VB, restart Windows,
- run VB, load your project and go straight to compiling. Otherwise,
- your EXE may be larger in file size than necessary due to 'garbage'
- getting included in the EXE. For some reason, VB does not fully
- clean up all of the previously used variables or objects that you
- may have been playing with while developing your program so these
- get included in your EXE even though they aren't used. Other VB
- users have even advocated saving all the project files as ASCII,
- then loading the ASCII files before compiling to further "clean up"
- the resulting EXE file.
-
- 3. Multiple END statements can be dangerous; or, The program that
- refused to terminate.
-
- Suggestion: put the END statement used to exit your program *only*
- in the Form_Unload event of the main form. Whenever you want to end
- the program, just tell the main form to unload.
-
- Some have reported that after their program have (supposedly)
- terminated, it still appears in the task list. This can happen if
- you only hide secondary forms and forget to unload them when you
- end/unload the main form.
-
- Also note that the Stop-button on the button-bar of the integrated
- development environment doesn't really unload anything. It *nukes*
- the program, which generally is a good idea since it could be a bug
- in it that caused it to be stuck in an eternal loop or something.
-
- 4. What are the latest versions of the various files used by VB?
-
-
- Date File to download Updates files Description
-
- 3/7/94 BTR110.EXE BTRV110.DLL Btrieve IISAM Driver
-
- 3/7/94 DATAINDX.EXE DATAINDX.DOC "Data Access Guide"
- Index
-
- 3/7/94 GENERIC.EXE \VB\CDK\GENERIC Sample custom control
- source
-
- 3/7/94 VBGRID.EXE GRID.VBX Grid control
-
- 3/7/94 VBHC505.EXE HC.EXE, HCP.EXE WinHelp compiler
-
- 3/7/94 MSAJT.EXE MSAJT110.DLL Access Database Engine
-
- 3/8/94 MSCOMM.EXE MSCOMM.VBX Serial
- Communications\control
-
- 3/7/94 ORA110.EXE ORACLE.TXT Updated ORACLE.TXT file
-
- 6/27/94 SETUPK.EXE SETUP.EXE Setup Toolkit
-
- 3/7/94 VBRUN300.EXE VBRUN300.DLL Visual Basic Runtime
- Library
-
- 3/7/94 XBS110.EXE XBS110.DLL XBase IISAM Driver
-
-
- There is an article in the Microsoft Knowledge Base that points to
- each of these files and provides more detailed information about
- the update. To find these articles, query the Microsoft Knowledge
- Base using the file name and the word "update3.00".
-
- Note the NEW SETUPKIT update!
- [Thanks to Marks Harrop <harrop@werple.apana.org.au>]
-
- Please inform the FAQ maintainer about newer versions.
-
-
- I. VISUAL BASIC FOR APPLICATIONS (VBA)
-
-
- 1. Any tips for VB/Win 3 programmers moving to VBA?
-
- You are in for some surprises. VBA is more unlike VB 3 than most
- people thought. Especially the development environment is very
- different, and the language puts more emphasis on objects. The
- latter is a trend you can get used to for VB also.
-
- For Excel 5 VBA, be aware that the environment is based on the
- "workbook" idea Microsoft stole from Borland. Your controls will be
- placed in one sheet, and the code will be in another.
- Doubleclicking on the control to open the code window doesn't help.
- You have to use the "Tools|Assign Macro" menu option.
-
- Also, be aware that the list of events is nowhere close to what VB3
- supports! No GotFocus, no MouseMove, no nothing. You'll be very
- confused if you try to look for "events" in the VBA docs!
-
- 2. Does VBA support VBXs?
-
- No. If Microsoft have its way, VBX is a dead end. There will never
- be 32-bit VBXs, but OCXs using OLE 2. VBA is more a subset of VB 4
- than VB 3, but it does not fully support OCX yet. It will, though.
-
- 3. How do I access properties on my dialog boxes in VBA?
-
- As noted above, VBA is a cultural chock for VB programmers. If you
- create a textbox in VBA, call it txName and try to
-
- cMyVar=txName.Text
-
- the impolite interpreter will give you a "variable not defined"
- error.
-
- The magic is objects. You have to
-
- Dim txName as Object
- Set txName = DialogSheets("NameDialog".EditBoxes("txName"))
-
- And then you can access your properties like you used to in good
- ol' VB 3. (Anyone volunteer to beat senseless the guy who thought
- out this?)
-
- 4. How do I use database routines from Excel VBA?
-
- The documentation is somewhere between sparse and inexistant on
- this topic. Any info on VBA and SQL would be much appreciated.
-
- Here Microsoft breaks the tradition and you *can't* use database
- objects, at least not the way you do in VB. Also, forget dynasets.
-
- I know nothing about databases in VBA. I just bring on the
- following tips from various magazines:
-
- Both SQLOpen and QueryGetData require a 'connection string'. That's
- about what the doc's say about the parameter. What is it? The doc
- is also tragically void of useful examples. Someone dug up the
- following example:
-
- "DSN=My data file;DBQ=c:\access\data.mdb;FIL=RedISAM;"
-
- which is about as understandable as it looks. If you use an empty
- string, you get a dialog which also can give you the string into a
- spreadsheet cell.
-
- Also, search for SQLREQUEST in the *main* help file for Excel 5
- (not the VBA help!) for these examples of connection_string's:
-
- dBASE DSN=NWind;PWD=test
- SQL Server DSN=MyServer;UID=dbayer;PWE=123;Database=Pubs
- ORACLE DNS=My Oracle Data Source;DBQ=MYSER VER;
- |UID=JohnS;PWD=Sesame
-
- There's a KnowledgeBase on Excel 5 on ftp.microsoft.com. Last time
- I looked, it was void of database stuff. Still, it may be a good
- idea to download it as the situation may have changed now.
-
-
- *** END OF VB/WIN FAQ DOCUMENT ***
-
-
-
-